package jwj8508;

public class J15_OOP1 {

	// 객체지향 개발 기법
	// OOP : Object Oriented Programing 객체를 기반으로 프로그램을 작성하는 것
	// OOP 언어로 응용 프로그램을 개발하는 경우, 문제 해결을 위해
	// 실제 상황과 유사한 모델을 만들어야 함

	// 예를 들어, 직원 세금을 계산하는 프로그램 작성
	// 프로그램에서 회사를 표현하는 회사객체가 필요
	// 또한 직원을 나타내는 직원객체, 세금을 나타내는 세금객체도 필요

	// 회사, 직원, 세금 객체를 자바 프로그램에서 코드로 나타내는 방법에 대해 알아봄

	// 모든 객체에는 두가지 성질이 있음
	// [속성property], 객체가 할 수 있는 [행동action]
	// 현실세계에 존재하는 객체를 자바언어로 가져오는 경우에도 속성과 행위는 있어야 함
	// 자바에서 속성은 field, 행위는 method라 함
	// 필드와 메서드는 선택사항(생략가능)임

	// 자바 객체를 만드는 방법은? - 설계도를 이용
	// '차'라는 객체를 잘 만들려면 좋은 차로 만들어 주는 [설계도]를 참고
	// OOP에서 객체를 만들어 주는 설계도를 [클래스]라 함

	// 클래스는 동일한 유형의 객체를 만드는 청사진/설계도 또는 템풀릿임 (중요!)
	// 붕어빵 => 객체
	// 붕어빵 틀 => 클래스
	// 밀가루, 팥 => 속성
	// 클래스는 당신이 만들려는 객체의 종류를 결정함

	// 클래스는 프로그래머로 하여금 문제의 추상화를 만들 수 있게 해주는 OOP 도구임
	// OOP에서 추상화abstraction는 실제 객체를 표현하기 위해 실제 객체에서
	// 핵심적인 개념 또는 기능을 뽑아 프로그래밍 객체로 만드는 행위를 말함

	// 클래스는 자바 프로그램의 기본 뼈대
	// 자바 초보자는 클래스를 작성할 때 클래스 이름, 필드, 메서드 등을 고려할 것

	// 클래스 만들기
	// class 클래스이름 {
	// 클래스 몸체(필드, 메서드)
	// }
	
	// 클래스 이름은 반드시 대문자로 시작
	// 클래스 정의시 클래스 이름과 파일 이름은 동일해야 함
	// 클래스 내에 선언된 변수를 필드field라 함
	
	

	public static void main(String[] args) {
		// 클래스를 사용하지 않고 학생 객체 생성
		String name1 = "정원진";
		int stdNo1 = 123;
		String addr1 = "경기도 안양";
		int mp1 = 01010101010;
		
		String name2 = "전수진";
		int stdNo2 = 124;
		String addr2 = "서울특별시";
		int mp2 = 01010101123;
		
		// 클래스를 이용해서 학생 객체 생성
		/*Student wonjin = new Student();
		wonjin.name = "원진";
		wonjin.stdNo = 123;
		wonjin.addr = "경기도 안양";
		wonjin.mp = 1234567899;
		
		Student sujin = new Student();
		sujin.name = "수진";
		sujin.stdNo = 124;
		sujin.addr = "서울";
		sujin.mp = 1334567819;*/
		
		// 생성자를 이용한 학생 객체 생성
		Student one = new Student();
		System.out.println(one.name);
		System.out.println(one.stdNo);
		System.out.println(one.addr);
		System.out.println(one.mp);
		
		Student two = new Student();
		System.out.println(two.name);
		System.out.println(two.stdNo);
		System.out.println(two.addr);
		System.out.println(two.mp);
		
		Customer cu = new Customer();
		System.out.println(cu.userid);
		System.out.println(cu.pwd);
		System.out.println(cu.name);
		System.out.println(cu.addr);
		
		Product p = new Product();
		
		TerranUnit tu = new TerranUnit();
		
		
		
		
	}	// main

}	// class

// 학생 클래스 정의
class Student {
	// 필드 선언
	String name;
	int stdNo;
	String addr;
	int mp;
	
	// 생성자 추가 - 객체를 초기화하는데 사용
	public Student() {
		stdNo = 98372;
		name = "아무개";
		addr = "서울";
		mp = 234523431;
		
	}
}

// 고객(Customer) 클래스 정의
// 아이디, 비밀번호, 이름, 주소, 전화번호, 이메일
class Customer {
	String userid;
	String pwd;
	String name;
	String addr;
	String mp;
	String email;
	
	public Customer() {
		userid = "00";
		pwd = "1234";
		name = "아무개";
		addr = "서울";
		mp = "010-1389-2734";
		email = "something@som.com";
	}
}

// 상품(Product) 클래스 정의
// 상품번호, 상품명, 가격, 종류, 제조사
class Product {
	int pno;
	String pname;
	int price;
	String ptype;
	String maker;
	
	public Product() {
		pno = 123;
		pname = "Lunar";
		price = 139_000;
		ptype = "shoes";
		maker = "nike";
	}
}

// 스타크래프트 2의 테란 유닛(TerranUnit)을 클래스로 정의
// 생명력, 에너지, 방어력, 광물, 베스핀, 보급품, 생산시간 
class TerranUnit {
	int hp;
	int energy;
	int amor;
	int mineral;
	int gas;
	int supply;
	int time;
	
	public TerranUnit() {
		hp = 100;
		energy = 0;
		amor = 10;
		mineral = 150;
		gas = 0;
		supply = 2;
		time = 30;
	}
}
















